package vues.album;

import images.ImageResize;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.Document;
import javax.swing.JButton;

import java.awt.Cursor;
import java.awt.Font;

import javax.swing.JLabel;
import java.awt.Color;

import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ImageIcon;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.JList;

import modeles.Artiste;
import javax.swing.ListSelectionModel;
import java.awt.Toolkit;

public class AjouterModifier extends JFrame implements DocumentListener, ListSelectionListener{
	private static final long serialVersionUID = 1L;
	
	private JPanel contentPane;
	private JButton btnAnnuler;
	private JButton btnTerminer;
	private JLabel lblVisuelPhoto;
	private JLabel lblPhoto;
	private JButton btnOuvrir;
	private JLabel lblTitre;
	private JLabel lblGenre;
	private JLabel lblMaison;
	private JLabel lblPrix;
	private JLabel lblAnnee;
	private JTextField txtTitre;
	private JTextField txtGenre;
	private JTextField txtAnnee;
	private JTextField txtPrix;
	private JTextField txtMaison;
	private Album album;
	private modeles.Album modAlbum = null;
	private String image;
	private JScrollPane scrollArtisteList;
	private DefaultListModel<Artiste> artisteListModel;
	
	private boolean vTitre, vGenre, vAnnee, vPrix, vMaison;
	private JList<Artiste> listArtiste;

	/**
	 * Create the frame.
	 */
	public AjouterModifier(Album album, modeles.Album modAlbum) {
		setIconImage(Toolkit.getDefaultToolkit().getImage(AjouterModifier.class.getResource("/images/Album.png")));
		setTitle("Ajout/Modification d'un album");
		this.album = album;
		this.modAlbum = modAlbum;
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 453, 386);
		setResizable(false);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		contentPane.add(getBtnAnnuler());
		contentPane.add(getBtnTerminer());
		contentPane.add(getLblVisuelPhoto());
		contentPane.add(getLblPhoto());
		contentPane.add(getBtnOuvrir());
		contentPane.add(getLblTitre());
		contentPane.add(getLblGenre());
		contentPane.add(getLblMaison());
		contentPane.add(getLblPrix());
		contentPane.add(getLblAnnee());
		contentPane.add(getTxtTitre());
		contentPane.add(getTxtGenre());
		contentPane.add(getTxtAnnee());
		contentPane.add(getTxtPrix());
		contentPane.add(getTxtMaison());
		contentPane.add(getScrollArtisteList());
		getRootPane().setDefaultButton(btnTerminer);
		
		if(modAlbum != null){
			txtTitre.setText(modAlbum.getTitre());
			txtGenre.setText(modAlbum.getGenre());
			txtAnnee.setText("" + modAlbum.getAnnee());
			txtPrix.setText("" + modAlbum.getPrix());
			txtMaison.setText(modAlbum.getMaison());
			image = modAlbum.getCouverture();
			for(int i = 0; i < artisteListModel.getSize(); i ++){
				if(artisteListModel.get(i).getId() == modAlbum.getArtiste().getId()){
					listArtiste.setSelectedIndex(i);
				}
			}
			lblVisuelPhoto.setIcon(ImageResize.createImage(new ImageIcon(modAlbum.getCouverture()), lblVisuelPhoto.getWidth(), lblVisuelPhoto.getHeight()));
			modification(null);
		}
	}

	private JButton getBtnAnnuler() {
		if (btnAnnuler == null) {
			btnAnnuler = new JButton("Annuler");
			btnAnnuler.setIcon(new ImageIcon(AjouterModifier.class.getResource("/images/Boutons/Annuler.png")));
			btnAnnuler.setCursor(new Cursor(Cursor.HAND_CURSOR));
			btnAnnuler.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					dispose();
				}
			});
			btnAnnuler.setFont(new Font("Andalus", Font.PLAIN, 12));
			btnAnnuler.setBounds(209, 314, 101, 23);
		}
		return btnAnnuler;
	}

	private JButton getBtnTerminer() {
		if (btnTerminer == null) {
			btnTerminer = new JButton("Terminer");
			btnTerminer.setIcon(new ImageIcon(AjouterModifier.class.getResource("/images/Boutons/Terminer.png")));
			btnTerminer.setCursor(new Cursor(Cursor.HAND_CURSOR));
			btnTerminer.setEnabled(false);
			btnTerminer.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					if(modAlbum == null){
						modAlbum = new modeles.Album();
					}
					modAlbum.setTitre(txtTitre.getText());
					modAlbum.setGenre(txtGenre.getText());
					modAlbum.setAnnee(Integer.parseInt(txtAnnee.getText()));
					modAlbum.setPrix(Double.parseDouble(txtPrix.getText()));
					modAlbum.setMaison(txtMaison.getText());
					modAlbum.setCouverture(image);
					modAlbum.setArtiste(listArtiste.getSelectedValue());
					modAlbum.enregistrer();
					album.update();
					dispose();
				}
			});
			btnTerminer.setFont(new Font("Andalus", Font.PLAIN, 12));
			btnTerminer.setBounds(320, 314, 107, 23);
		}
		return btnTerminer;
	}

	private JLabel getLblVisuelPhoto() {
		if (lblVisuelPhoto == null) {
			lblVisuelPhoto = new JLabel("");
			lblVisuelPhoto.setBounds(139, 144, 288, 159);
			lblVisuelPhoto.setIcon(ImageResize.createImage(new ImageIcon(AjouterModifier.class.getResource("/images/Album.png")), lblVisuelPhoto.getWidth(), lblVisuelPhoto.getHeight()));
		}
		return lblVisuelPhoto;
	}

	private JLabel getLblPhoto() {
		if (lblPhoto == null) {
			lblPhoto = new JLabel("Photo :");
			lblPhoto.setFont(new Font("Andalus", Font.PLAIN, 18));
			lblPhoto.setBounds(10, 144, 63, 14);
		}
		return lblPhoto;
	}

	private JButton getBtnOuvrir() {
		if (btnOuvrir == null) {
			btnOuvrir = new JButton("Ouvrir");
			btnOuvrir.setIcon(new ImageIcon(AjouterModifier.class.getResource("/images/Boutons/Ouvrir.png")));
			btnOuvrir.setCursor(new Cursor(Cursor.HAND_CURSOR));
			btnOuvrir.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					JFileChooser chooser = new JFileChooser();
					int returnVal = chooser.showOpenDialog(getParent());
					if (returnVal == JFileChooser.APPROVE_OPTION) {
						File file = chooser.getSelectedFile();
						lblVisuelPhoto.setIcon(ImageResize.createImage(file.getAbsolutePath(), lblVisuelPhoto.getWidth(), lblVisuelPhoto.getHeight()));
						image = file.getAbsolutePath();
						modification(null);
					} else {
						System.out.println("Open command cancelled by user.\n");
					}
				}
			});

			btnOuvrir.setFont(new Font("Andalus", Font.PLAIN, 12));
			btnOuvrir.setBounds(22, 280, 101, 23);
		}
		return btnOuvrir;
	}

	private JLabel getLblTitre() {
		if (lblTitre == null) {
			lblTitre = new JLabel("Titre :");
			lblTitre.setFont(new Font("Andalus", Font.PLAIN, 18));
			lblTitre.setBounds(9, 11, 46, 14);
		}
		return lblTitre;
	}

	private JLabel getLblGenre() {
		if (lblGenre == null) {
			lblGenre = new JLabel("Genre :");
			lblGenre.setFont(new Font("Andalus", Font.PLAIN, 18));
			lblGenre.setBounds(10, 36, 63, 14);
		}
		return lblGenre;
	}

	private JLabel getLblMaison() {
		if (lblMaison == null) {
			lblMaison = new JLabel("Distribu\u00E9 par :");
			lblMaison.setFont(new Font("Andalus", Font.PLAIN, 18));
			lblMaison.setBounds(10, 112, 114, 14);
		}
		return lblMaison;
	}

	private JLabel getLblPrix() {
		if (lblPrix == null) {
			lblPrix = new JLabel("Prix :");
			lblPrix.setFont(new Font("Andalus", Font.PLAIN, 18));
			lblPrix.setBounds(10, 86, 46, 14);
		}
		return lblPrix;
	}

	private JLabel getLblAnnee() {
		if (lblAnnee == null) {
			lblAnnee = new JLabel("Ann\u00E9e de sortie :");
			lblAnnee.setFont(new Font("Andalus", Font.PLAIN, 18));
			lblAnnee.setBounds(10, 61, 128, 14);
		}
		return lblAnnee;
	}

	private JTextField getTxtTitre() {
		if (txtTitre == null) {
			txtTitre = new JTextField();
			txtTitre.setForeground(new Color(0, 0, 0));
			txtTitre.setFont(new Font("Andalus", Font.PLAIN, 18));
			txtTitre.setBackground(Color.PINK);
			txtTitre.setBounds(65, 8, 196, 20);
			txtTitre.setColumns(10);
			txtTitre.getDocument().addDocumentListener(this);
		}
		return txtTitre;
	}

	private JTextField getTxtGenre() {
		if (txtGenre == null) {
			txtGenre = new JTextField();
			txtGenre.setForeground(new Color(0, 0, 0));
			txtGenre.setFont(new Font("Andalus", Font.PLAIN, 18));
			txtGenre.setBackground(Color.PINK);
			txtGenre.setBounds(75, 33, 186, 20);
			txtGenre.setColumns(10);
			txtGenre.getDocument().addDocumentListener(this);
		}
		return txtGenre;
	}

	private JTextField getTxtAnnee() {
		if (txtAnnee == null) {
			txtAnnee = new JTextField();
			txtAnnee.setForeground(new Color(0, 0, 0));
			txtAnnee.setFont(new Font("Andalus", Font.PLAIN, 18));
			txtAnnee.setBackground(Color.PINK);
			txtAnnee.setBounds(139, 58, 122, 20);
			txtAnnee.setColumns(10);
			txtAnnee.getDocument().addDocumentListener(this);
		}
		return txtAnnee;
	}

	private JTextField getTxtPrix() {
		if (txtPrix == null) {
			txtPrix = new JTextField();
			txtPrix.setForeground(new Color(0, 0, 0));
			txtPrix.setFont(new Font("Andalus", Font.PLAIN, 18));
			txtPrix.setBackground(Color.PINK);
			txtPrix.setBounds(53, 83, 208, 20);
			txtPrix.setColumns(10);
			txtPrix.getDocument().addDocumentListener(this);
		}
		return txtPrix;
	}

	private JTextField getTxtMaison() {
		if (txtMaison == null) {
			txtMaison = new JTextField();
			txtMaison.setForeground(new Color(0, 0, 0));
			txtMaison.setFont(new Font("Andalus", Font.PLAIN, 18));
			txtMaison.setBackground(Color.PINK);
			txtMaison.setBounds(120, 109, 141, 20);
			txtMaison.setColumns(10);
			txtMaison.getDocument().addDocumentListener(this);
		}
		return txtMaison;
	}

	@Override
	public void changedUpdate(DocumentEvent e) {
		modification(e.getDocument());
	}
	@Override
	public void insertUpdate(DocumentEvent e) {
		modification(e.getDocument());
	}
	@Override
	public void removeUpdate(DocumentEvent e) {
		modification(e.getDocument());
	}
	
	private void modification(Document d){
		if(d == txtTitre.getDocument()){
			vTitre = isTitreValid();
			if(vTitre){
				txtTitre.setBackground(Color.white);
			}else{
				txtTitre.setBackground(Color.pink);
			}
		}else if(d == txtGenre.getDocument()){
			vGenre = isGenreValid();
			if(vGenre){
				txtGenre.setBackground(Color.white);
			}else{
				txtGenre.setBackground(Color.pink);
			}
		}else if(d == txtAnnee.getDocument()){
			vAnnee = isAnneeValid();
			if(vAnnee){
				txtAnnee.setBackground(Color.white);
			}else{
				txtAnnee.setBackground(Color.pink);
			}
		}else if(d == txtPrix.getDocument()){
			vPrix = isPrixValid();
			if(vPrix){
				txtPrix.setBackground(Color.white);
			}else{
				txtPrix.setBackground(Color.pink);
			}
		}else if(d == txtMaison.getDocument()){
			vMaison = isMaisonValid();
			if(vMaison){
				txtMaison.setBackground(Color.white);
			}else{
				txtMaison.setBackground(Color.pink);
			}
		}
		if(vTitre && vGenre && vAnnee && vPrix && vMaison && image != null && listArtiste.getSelectedValue() != null){
			btnTerminer.setEnabled(true);
		}else{
			btnTerminer.setEnabled(false);
		}
	}
	private boolean isTitreValid(){
		if(txtTitre.getText().length() > 0){
			return true;
		}
		return false;
	}
	private boolean isGenreValid(){
		if(txtGenre.getText().length() > 0){
			return true;
		}
		return false;
	}
	private boolean isAnneeValid(){
		if(txtAnnee.getText().length() > 0){
			try{
				Integer.parseInt(txtAnnee.getText());
				return true;
			}catch(NumberFormatException e){}
		}
		return false;
	}
	private boolean isPrixValid(){
		if(txtAnnee.getText().length() > 0){
			try{
				Double.parseDouble(txtPrix.getText());
				return true;
			}catch(NumberFormatException e){}
		}
		return false;
	}
	private boolean isMaisonValid(){
		if(txtMaison.getText().length() > 0){
			return true;
		}
		return false;
	}
	private JList<Artiste> getListArtiste() {
		if (listArtiste == null) {
			artisteListModel = new DefaultListModel<Artiste>();
			for(Artiste artiste : Artiste.getAll()){
				artisteListModel.addElement(artiste);
			}
			listArtiste = new JList<Artiste>(artisteListModel);
			listArtiste.setFont(new Font("Andalus", Font.PLAIN, 14));
			listArtiste.setCursor(new Cursor(Cursor.HAND_CURSOR));
			listArtiste.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			listArtiste.addListSelectionListener(this);
		}
		return listArtiste;
	}
	private JScrollPane getScrollArtisteList(){
		if (scrollArtisteList == null) {
			scrollArtisteList = new JScrollPane(getListArtiste());
			scrollArtisteList.setBounds(271, 10, 156, 116);
		}
		return scrollArtisteList;
	}

	@Override
	public void valueChanged(ListSelectionEvent e) {
		if(e.getValueIsAdjusting()){
			modification(null);
		}
	}
}
